//
//  main.m
//  解归档
//
//  Created by apple on 15/9/6.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Ball.h"
#import "Human.h"
#import "Book.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
//  归档－－－> 通过实现NSCoding协议，可以讲Objective-C的对象保存到磁盘上；
        
//  解归档--->实现NSCoding协议反过来能够将保存到磁盘上的内容读取到内存中，并恢复成Objective-C的对象；
        
//        归档时需要对对象中的成员进行编码；
        
//        归档时，可以直接将对象存入文件中；

#if 0
        Ball *ball =[Ball new];
        ball.weight = 123.2;
        ball.color = @"red";
        
#endif

#if 0
        
        [NSKeyedArchiver archiveRootObject:ball toFile:@"/Users/apple/Desktop/ball.plist"];
        
//        归档后的文件可以通过解归档恢复成Objective-C的对象。
        Ball *ball1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/apple/Desktop/ball.plist"];
        
        NSLog(@"color:%@  \n weight:%f",ball1.color,ball1.weight);
        
#endif
//        --------------------------------------------------------------------
        
//        可以先将对象归档到内存，然后在存入文件
        
#if 0
     
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:ball];
        
        [data writeToFile:@"/Users/apple/Desktop/ball.plist" atomically:YES];
        
#endif
        
#if 0
        
//      同样的可以先将文件读取到内存中，然后再解归档；
    
        NSData *data = [NSData dataWithContentsOfFile:@"/Users/apple/Desktop/ball.plist"];
        Ball *ball2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        
        NSLog(@"color:%@  \n weight:%f",ball2.color,ball2.weight);
        
        
#endif
       
#if 1
//        归档时，会从当前对象开始，将它的所有属性（成员变量）的值（包括引用的对象）全部归档。
        
//        实例变量引用的对象也必须可以归档
        
        Human *human = [Human new];
        human.age = 23;
        
        human.book = [Book new];
        human.book.money = 24;
        
        [NSKeyedArchiver archiveRootObject:human toFile:@"/Users/apple/Desktop/123.plist"];
        

#endif
    }
    return 0;
}
